/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IPromedioDAO;
import desarrollosoft.ghce.entidades.Consulta;
import desarrollosoft.ghce.entidades.Diagnostico;
import desarrollosoft.ghce.entidades.Intervencion;
import desarrollosoft.ghce.entidades.Paciente;
import desarrollosoft.ghce.entidades.Sexo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;

/**
 *
 * @author ariel
 */
@Repository("promedioDAO")
public class PromedioDAO implements IPromedioDAO {

    @PersistenceContext
    private EntityManager entityManager;
    
    @Override
    public Double obtenerPromedioEdades(Diagnostico diagnostico, Sexo sexo, Date fechaDesde, Date fechaHasta) {
        String jpqlIntervenciones = "SELECT i FROM Intervencion i WHERE "
                + "i.fecha BETWEEN :fechaMinima AND :fechaMaxima AND i.diagnostico = :diagnostico";
        
        String jpqlConsultas = "SELECT c FROM Consulta c WHERE "
                + "c.fecha BETWEEN :fechaMinima AND :fechaMaxima AND c.diagnostico = :diagnostico";
        
        if (sexo != null) {
            jpqlIntervenciones += " AND i.paciente.sexo = :sexo";
            jpqlConsultas += " AND c.paciente.sexo = :sexo";
        }
        
        Query consultaIntervenciones = entityManager.createQuery(jpqlIntervenciones);
        Query consultaConsultas = entityManager.createQuery(jpqlConsultas);
        
        //
        consultaIntervenciones.setParameter("fechaMinima", fechaDesde);
        consultaIntervenciones.setParameter("fechaMaxima", fechaHasta);
        
        consultaConsultas.setParameter("fechaMinima", fechaDesde);
        consultaConsultas.setParameter("fechaMaxima", fechaHasta);
        
        consultaIntervenciones.setParameter("diagnostico", diagnostico);
        consultaConsultas.setParameter("diagnostico", diagnostico);
        
        if (sexo != null) {
            consultaIntervenciones.setParameter("sexo", sexo);
            consultaConsultas.setParameter("sexo", sexo);
        }
        
        List<Intervencion> listaIntervenciones = consultaIntervenciones.getResultList();
        List<Consulta> listaConsultas = consultaConsultas.getResultList();
        
        List<Paciente> listaPacientes = new ArrayList<>();
        
        for (Intervencion intervencion : listaIntervenciones) {
            Paciente paciente = intervencion.getPaciente();
            if (!listaPacientes.contains(paciente)) {
                listaPacientes.add(paciente);
            }
        }
        
        for (Consulta consulta : listaConsultas) {
            Paciente paciente = consulta.getPaciente();
            if (!listaPacientes.contains(paciente)) {
                listaPacientes.add(paciente);
            }
        }
        
        if (listaPacientes.isEmpty()) {
            return null;
        }
        
        int cantidadPacientes = listaPacientes.size();
        int sumaEdades = 0;
        for (Paciente paciente : listaPacientes) {
            sumaEdades += paciente.getEdad();
        }
        return ( ((double) sumaEdades) / ((double) cantidadPacientes) );
    }
    
}
